package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type stu struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Version string `json:"version"`
}

func main() {

	m1 := map[string]interface{}{"sdf": "sdf"}
	m3 := m1
	m2 := make(map[string]interface{})
	m4 := m2

	s1 := stu{
		Name:    "",
		Age:     0,
		Version: "",
	}
	s2 := s1
	fmt.Printf("%p\r\n", m1)
	fmt.Printf("%p\r\n", m2)
	fmt.Printf("%p\r\n", m3)
	fmt.Printf("%p\r\n", m4)
	fmt.Printf("%p\r\n", &s1)
	fmt.Printf("%p\r\n", &s2)

	g := gin.Default()
	//获取path路径中的参数
	//:只匹配斜线之间的一个参数，
	//*可以匹配任意多个斜线之间的参数,*只能用在path最末尾
	g.GET("/testPathParam/:name/*age", func(c *gin.Context) {
		name := c.Param("name")
		age := c.Param("age")
		m := make(map[string]interface{})
		m["name"] = name
		m["age"] = age
		c.JSON(http.StatusOK, m)
	})

	//获取用?传递的参数
	g.GET("/test/query", func(c *gin.Context) {
		name := c.DefaultQuery("name", "n")
		age := c.DefaultQuery("age", "a")
		m := make(map[string]interface{})
		m["name"] = name
		m["age"] = age
		c.JSON(http.StatusOK, m)
	})

	//获取请求body中的json对象
	g.POST("/test/json", func(c *gin.Context) {
		stu := &stu{}
		c.BindJSON(stu)

		c.JSON(http.StatusOK, stu)
	})

	//上传文件
	g.POST("/test/uploadFile", func(c *gin.Context) {
		//上传单个文件
		file, _ := c.FormFile("")
		println(file.Filename)
		c.SaveUploadedFile(file, "目标文件名称")

		//上传多个文件
		form, _ := c.MultipartForm()
		f := form.File
		for s := range f {
			headers := f[s]
			for _, v := range headers {
				println(v.Filename)
				c.SaveUploadedFile(v, "目标文件名称")
			}
		}
		c.JSON(http.StatusOK, file)
	})

	//设置路由组，可以设置一个总的路由，然后在总路由下设置子路由
	v1 := g.Group("/v1")
	v1.POST("/test", func(context *gin.Context) {
		s := &stu{}
		s.Version = "v1"
		context.JSON(http.StatusOK, &stu{})
	})

	v2 := g.Group("/v2")
	v2.POST("/test", func(context *gin.Context) {
		s := &stu{}
		s.Version = "v2"
		context.JSON(http.StatusOK, &stu{})
	})

	//重定向
	g.GET("/test/redirect", func(context *gin.Context) {

		context.Redirect(http.StatusMovedPermanently, "http://www.baidu.com")
	})

	//请求转发
	g.POST("/test/forward", func(context *gin.Context) {
		fmt.Println(context.Request.URL.Path)
		context.Request.URL.Path = "/test/json"
		g.HandleContext(context)
	})

	//请求转发
	g.POST("/test/err", func(context *gin.Context) {
		panic("ddd")
	})

	g.Run(":9898")
}
